<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Interactive BOM for KiCAD</title>
  <style type="text/css">
:root {
  --pcb-edge-color: black;
  --pad-color: #878787;
  --pad-color-highlight: #D04040;
  --pin1-outline-color: #ffb629;
  --pin1-outline-color-highlight: #b4ff03;
  --silkscreen-edge-color: #aa4;
  --silkscreen-polygon-color: #4aa;
  --silkscreen-text-color: #4aa;
  --fabrication-edge-color: #907651;
  --fabrication-polygon-color: #907651;
  --fabrication-text-color: #a27c24;
  --track-color: #def5f1;
  --track-color-highlight: #D04040;
  --zone-color: #def5f1;
  --zone-color-highlight: #d0404080;
}

html, body {
  margin: 0px;
  height: 100%;
  font-family: Verdana, sans-serif;
}

.dark.topmostdiv {
  --pcb-edge-color: #eee;
  --pad-color: #808080;
  --pin1-outline-color: #ffa800;
  --pin1-outline-color-highlight: #ccff00;
  --track-color: #42524f;
  --zone-color: #42524f;
  background-color: #252c30;
  color: #eee;
}

button {
  background-color: #eee;
  border: 1px solid #888;
  color: black;
  height: 44px;
  width: 44px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 14px;
  font-weight: bolder;
}

.dark button {
  /* This will be inverted */
  background-color: #c3b7b5;
}

button.depressed {
  background-color: #0a0;
  color: white;
}

.dark button.depressed {
  /* This will be inverted */
  background-color: #b3b;
}

button:focus {
  outline: 0;
}

button#tb-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}

button#lr-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}

button#bom-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-grouped-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-ungrouped-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-netlist-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}

button#copy {
  background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
  background-position: 6px 6px;
  background-repeat: no-repeat;
  background-size: 26px 26px;
  border-radius: 6px;
  height: 40px;
  width: 40px;
  margin: 10px 5px;
}

button#copy:active {
    box-shadow: inset 0px 0px 5px #6c6c6c;
}

textarea.clipboard-temp {
  position: fixed;
  top: 0;
  left: 0;
  width: 2em;
  height: 2em;
  padding: 0;
  border: None;
  outline: None;
  box-shadow: None;
  background: transparent;
}

.left-most-button {
  border-right: 0;
  border-top-left-radius: 6px;
  border-bottom-left-radius: 6px;
}

.middle-button {
  border-right: 0;
}

.right-most-button {
  border-top-right-radius: 6px;
  border-bottom-right-radius: 6px;
}

.button-container {
  font-size: 0;
  margin: 10px 10px 10px 0px;
}

.dark .button-container {
  filter: invert(1);
}

.button-container button {
  background-size: 32px 32px;
  background-position: 5px 5px;
  background-repeat: no-repeat;
}

@media print {
  .hideonprint {
    display: none;
  }
}

canvas {
  cursor: crosshair;
}

canvas:active {
  cursor: grabbing;
}

.fileinfo {
  width: 100%;
  max-width: 1000px;
  border: none;
  padding: 5px;
}

.fileinfo .title {
  font-size: 20pt;
  font-weight: bold;
}

.fileinfo td {
  overflow: hidden;
  white-space: nowrap;
  max-width: 1px;
  width: 50%;
  text-overflow: ellipsis;
}

.bom {
  border-collapse: collapse;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 10pt;
  table-layout: fixed;
  width: 100%;
  margin-top: 1px;
}

.bom th, .bom td {
  border: 1px solid black;
  padding: 5px;
  word-wrap: break-word;
  text-align: center;
  position: relative;
}

.dark .bom th, .dark .bom td {
  border: 1px solid #777;
}

.bom th {
  background-color: #CCCCCC;
  background-clip: padding-box;
}

.dark .bom th {
  background-color: #3b4749;
}

.bom tr.highlighted:nth-child(n) {
  background-color: #cfc;
}

.dark .bom tr.highlighted:nth-child(n) {
  background-color: #226022;
}

.bom tr:nth-child(even) {
  background-color: #f2f2f2;
}

.dark .bom tr:nth-child(even) {
  background-color: #313b40;
}

.bom tr {
  transition: background-color 0.2s;
}

.bom .numCol {
  width: 25px;
}

.bom .Description {
  width: 10%;
}

.bom .Part {
  width: 10%;
}

.bom .Value {
  width: 15%;
}

.bom .Quantity {
  width: 65px;
}

.bom th .sortmark {
  position: absolute;
  right: 1px;
  top: 1px;
  margin-top: -5px;
  border-width: 5px;
  border-style: solid;
  border-color: transparent transparent #221 transparent;
  transform-origin: 50% 85%;
  transition: opacity 0.2s, transform 0.4s;
}

.dark .bom th .sortmark {
  filter: invert(1);
}

.bom th .sortmark.none {
  opacity: 0;
}

.bom th .sortmark.desc {
  transform: rotate(180deg);
}

.bom th:hover .sortmark.none {
  opacity: 0.5;
}

.bom .bom-checkbox {
  width: 30px;
  position: relative;
  user-select: none;
  -moz-user-select: none;
}

.bom .bom-checkbox:before {
  content: "";
  position: absolute;
  border-width: 15px;
  border-style: solid;
  border-color: #51829f transparent transparent transparent;
  visibility: hidden;
  top: -15px;
}

.bom .bom-checkbox:after {
  content: "Double click to set/unset all";
  position: absolute;
  color: white;
  top: -35px;
  left: -26px;
  background: #51829f;
  padding: 5px 15px;
  border-radius: 8px;
  white-space: nowrap;
  visibility: hidden;
}

.bom .bom-checkbox:hover:before, .bom .bom-checkbox:hover:after {
  visibility: visible;
  transition: visibility 0.2s linear 1s;
}

.split {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  overflow-y: auto;
  overflow-x: hidden;
  background-color: inherit;
}

.split.split-horizontal, .gutter.gutter-horizontal {
  height: 100%;
  float: left;
}

.gutter {
  background-color: #ddd;
  background-repeat: no-repeat;
  background-position: 50%;
  transition: background-color 0.3s;
}

.dark .gutter {
  background-color: #777;
}

.gutter.gutter-horizontal {
  background-image: url('');
  cursor: ew-resize;
  width: 5px;
}

.gutter.gutter-vertical {
  background-image: url('');
  cursor: ns-resize;
  height: 5px;
}

.searchbox {
  float: left;
  height: 40px;
  margin: 10px 5px;
  padding: 12px 32px;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 18px;
  box-sizing: border-box;
  border: 1px solid #888;
  border-radius: 6px;
  outline: none;
  background-color: #eee;
  transition: background-color 0.2s, border 0.2s;
  background-image: url('');
  background-position: 10px 10px;
  background-repeat: no-repeat;
}

.dark .searchbox {
  background-color: #111;
  color: #eee;
}

.searchbox::placeholder {
  color: #ccc;
}

.dark .searchbox::placeholder {
  color: #666;
}

.filter {
  width: calc(60% - 64px);
}

.reflookup {
  width: calc(40% - 10px);
}

input[type=text]:focus {
  background-color: white;
  border: 1px solid #333;
}

.dark input[type=text]:focus {
  background-color: #333;
  border: 1px solid #ccc;
}

mark.highlight {
  background-color: #5050ff;
  color: #fff;
  padding: 2px;
  border-radius: 6px;
}

.dark mark.highlight {
  background-color: #76a6da;
  color: #111;
}

.menubtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
  background-position: center;
  background-repeat: no-repeat;
}

.statsbtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
}

.iobtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
}

.dark .statsbtn, .dark .savebtn, .dark .menubtn, .dark .iobtn {
  filter: invert(1);
}

.flexbox {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
}

.savebtn {
  background-color: #d6d6d6;
  width: auto;
  height: 30px;
  flex-grow: 1;
  margin: 5px;
  border-radius: 4px;
}

.savebtn:active {
  background-color: #0a0;
  color: white;
}

.dark .savebtn:active {
  /* This will be inverted */
  background-color: #b3b;
}

.stats {
  border-collapse: collapse;
  font-size: 12pt;
  table-layout: fixed;
  width: 100%;
  min-width: 450px;
}

.dark .stats td {
  border: 1px solid #bbb;
}

.stats td {
  border: 1px solid black;
  padding: 5px;
  word-wrap: break-word;
  text-align: center;
  position: relative;
}

#checkbox-stats div {
  position: absolute;
  left: 0;
  top: 0;
  height: 100%;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}

#checkbox-stats .bar {
  background-color: rgba(28, 251, 0, 0.6);
}

.menu {
  position: relative;
  display: inline-block;
  margin: 10px 10px 10px 0px;
}

.menu-content {
  display: none;
  position: absolute;
  background-color: white;
  right: 0;
  min-width: 300px;
  box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
  z-index: 100;
  padding: 8px;
}

.dark .menu-content {
  background-color: #111;
}

.menu:hover .menu-content {
  display: block;
}

.menu:hover .menubtn, .menu:hover .iobtn, .menu:hover .statsbtn {
  background-color: #eee;
}

.menu-label {
  display: inline-block;
  padding: 8px;
  border: 1px solid #ccc;
  border-top: 0;
  width: calc(100% - 18px);
}

.menu-label-top {
  border-top: 1px solid #ccc;
}

.menu-textbox {
  float: left;
  height: 24px;
  margin: 10px 5px;
  padding: 5px 5px;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 14px;
  box-sizing: border-box;
  border: 1px solid #888;
  border-radius: 4px;
  outline: none;
  background-color: #eee;
  transition: background-color 0.2s, border 0.2s;
  width: calc(100% - 10px);
}

.menu-textbox.invalid, .dark .menu-textbox.invalid {
  color: red;
}

.dark .menu-textbox {
  background-color: #222;
  color: #eee;
}

.topmostdiv {
  width: 100%;
  height: 100%;
  background-color: white;
  transition: background-color 0.3s;
}

#top {
  height: 78px;
  border-bottom: 2px solid black;
}

.dark #top {
  border-bottom: 2px solid #ccc;
}

#dbg {
  display: block;
}

::-webkit-scrollbar {
  width: 8px;
}

::-webkit-scrollbar-track {
  background: #aaa;
}

::-webkit-scrollbar-thumb {
  background: #666;
  border-radius: 3px;
}

::-webkit-scrollbar-thumb:hover {
  background: #555;
}

.slider {
  -webkit-appearance: none;
  width: 100%;
  margin: 3px 0;
  padding: 0;
  outline: none;
  opacity: 0.7;
  -webkit-transition: .2s;
  transition: opacity .2s;
  border-radius: 3px;
}

.slider:hover {
  opacity: 1;
}

.slider:focus {
  outline: none;
}

.slider::-webkit-slider-runnable-track {
  -webkit-appearance: none;
  width: 100%;
  height: 8px;
  background: #d3d3d3;
  border-radius: 3px;
  border: none;
}

.slider::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
  margin-top: -4px;
}

.dark .slider::-webkit-slider-thumb {
  background: #3d3;
}

.slider::-moz-range-thumb {
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
}

.slider::-moz-range-track {
  height: 8px;
  background: #d3d3d3;
  border-radius: 3px;
}

.dark .slider::-moz-range-thumb {
  background: #3d3;
}

.slider::-ms-track {
  width: 100%;
  height: 8px;
  border-width: 3px 0;
  background: transparent;
  border-color: transparent;
  color: transparent;
  transition: opacity .2s;
}

.slider::-ms-fill-lower {
  background: #d3d3d3;
  border: none;
  border-radius: 3px;
}

.slider::-ms-fill-upper {
  background: #d3d3d3;
  border: none;
  border-radius: 3px;
}

.slider::-ms-thumb {
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
  margin: 0;
}

.shameless-plug {
  font-size: 0.8em;
  text-align: center;
  display: block;
}

a {
  color: #0278a4;
}

.dark a {
  color: #00b9fd;
}

#frontcanvas, #backcanvas {
    touch-action: none;
}

  </style>
  <script type="text/javascript" >
///////////////////////////////////////////////
/*
  Split.js - v1.3.5
  MIT License
  https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});

///////////////////////////////////////////////

///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////

///////////////////////////////////////////////
/*!
 * PEP v0.4.3 | https://github.com/jquery/PEP
 * Copyright jQuery Foundation and other contributors | http://jquery.org/license
 */
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});

///////////////////////////////////////////////

///////////////////////////////////////////////
var config = {"show_fabrication": false, "redraw_on_drag": true, "highlight_pin1": false, "extra_fields": [], "dark_mode": false, "bom_view": "left-right", "board_rotation": 0, "checkboxes": "Sourced,Placed", "show_silkscreen": true, "show_pads": true, "layer_view": "FB"}
///////////////////////////////////////////////

///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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tZUdn6OTE5P9lzWVzELzC0sok5++kF2RVZI9kIOePZtjm0OVVp/NCJWTXZyVkuOZbZuwT+bhU5zxIt2VcZnDnv2b45vDn+OTI5ZTl1tD05Y0Kn2SI5pDkL8ZY5XNn1OQaeNDkZOVlpsjn9tDziUzlmOTM5YjnYORI5UTngOQY5sTlW6fE56zkKORNZi9m7OfvZGdnSOYY5M9khYic5WjnLWVDZkTmXOdE59jlbwQ2QEllOOf2ZxNlP2d059qRowvrpgBlt2QGZoBmEicGZyomM2as55qKyJAoZGDlbORHZbZlFOZI5G1klOe9ZtznaDPzixDl5OfC5KTmFOTg5ezl4OSs5YzluMVfMFNlwubuZ4Tmq2Rc56TkH2US5PdnlOf85lQSwuVZZNTnhWfM51jll2W5pNLlXOXQ5fB45kK05ZtnMOR05vzmi7hM5sCKATgbpwLlwWedZ9Nmd6aU59LnjOVpwpjljWfC5hdlfCY+p6Nm72ZjZjTnLOVvpBDlrOdhwyrkPWTi5BTmp2Ui5BLlSOZk5gTl06GgcRrmvmfA5HLmgORa5KLnXOYc5numSgYa5pzlPWTzZTrkvOfs5ZekEnqbQArlMOe05mumdOcv4cEHLaAJ8XjlSublZjtmyud/ZaLlQuX94QVm5OWfZ+Tk6OcduyjnIubDZdLly2ecJHtksuRm5lLkgOXo5ObkzWSDZ1rlI+FpZXrmeWY65ZbnOubm5erlZORFQFllpudM5SWlqubnp0akbGUo5DTlcuXhZrzm8uVBo36C9makh3zn12eG58ERvYW25fTmjmbG5Z1lI6eC5DNmfHsS5d3hHWRs5KrkUuU852bmNuRW5ATnouXr4fdm1uVg5iLn4uX65hLnNuVW5f3gLWSe52zlnudS5g7n+ua658rn5uWSJw1l3uRY5MZmimTs5NjkDufVZPLlVaZBgY7nvjscZPzmsOWExH7kxuQM5ILkcmfWpXdmVuYe5DrCOXLoERbmqubU5FDmj2VQ5nLmJmRe5lrl5ueo5ZImc7JRa5Lk1Gaa5ETm7uXh5LrlWuUh5V9DdAtD0STkmuZm59h5yadRZ1HkEeXE5ZImPwiR5aHnbuQs5h6nFOW85fLnV2YK5obkyGVO52EQzuWTQPHknWQu5DtkaGU7ZfDku2Wu54FKeOaR5wplzOXU59bkmqUs5tLlXuUh5nOx2uc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"))
///////////////////////////////////////////////

///////////////////////////////////////////////
/* Utility functions */

var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
  pcbdata.metadata.revision + '__#';
var storage;

function initStorage(key) {
  try {
    window.localStorage.getItem("blank");
    storage = window.localStorage;
  } catch (e) {
    // localStorage not available
  }
  if (!storage) {
    try {
      window.sessionStorage.getItem("blank");
      storage = window.sessionStorage;
    } catch (e) {
      // sessionStorage also not available
    }
  }
}

function readStorage(key) {
  if (storage) {
    return storage.getItem(storagePrefix + key);
  } else {
    return null;
  }
}

function writeStorage(key, value) {
  if (storage) {
    storage.setItem(storagePrefix + key, value);
  }
}

function fancyDblClickHandler(el, onsingle, ondouble) {
  return function() {
    if (el.getAttribute("data-dblclick") == null) {
      el.setAttribute("data-dblclick", 1);
      setTimeout(function() {
        if (el.getAttribute("data-dblclick") == 1) {
          onsingle();
        }
        el.removeAttribute("data-dblclick");
      }, 200);
    } else {
      el.removeAttribute("data-dblclick");
      ondouble();
    }
  }
}

function smoothScrollToRow(rowid) {
  document.getElementById(rowid).scrollIntoView({
    behavior: "smooth",
    block: "center",
    inline: "nearest"
  });
}

function focusInputField(input) {
  input.scrollIntoView(false);
  input.focus();
  input.select();
}

function copyToClipboard() {
  var text = '';
  for (var node of bomhead.childNodes[0].childNodes) {
    if (node.firstChild) {
      text = text + node.firstChild.nodeValue;
    }
    if (node != bomhead.childNodes[0].lastChild) {
      text += '\t';
    }
  }
  text += '\n';
  for (var row of bombody.childNodes) {
    for (var cell of row.childNodes) {
      for (var node of cell.childNodes) {
        if (node.nodeName == "INPUT") {
          if (node.checked) {
            text = text + '✓';
          }
        } else if (node.nodeName == "MARK") {
          text = text + node.firstChild.nodeValue;
        } else {
          text = text + node.nodeValue;
        }
      }
      if (cell != row.lastChild) {
        text += '\t';
      }
    }
    text += '\n';
  }
  var textArea = document.createElement("textarea");
  textArea.classList.add('clipboard-temp');
  textArea.value = text;

  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();

  try {
    if (document.execCommand('copy')) {
      console.log('Bom copied to clipboard.');
    }
  } catch (err) {
    console.log('Can not copy to clipboard.');
  }

  document.body.removeChild(textArea);
}

function removeGutterNode(node) {
  for (var i = 0; i < node.childNodes.length; i++) {
    if (node.childNodes[i].classList &&
      node.childNodes[i].classList.contains("gutter")) {
      node.removeChild(node.childNodes[i]);
      break;
    }
  }
}

function cleanGutters() {
  removeGutterNode(document.getElementById("bot"));
  removeGutterNode(document.getElementById("canvasdiv"));
}

var units = {
  prefixes: {
    giga: ["G", "g", "giga", "Giga", "GIGA"],
    mega: ["M", "mega", "Mega", "MEGA"],
    kilo: ["K", "k", "kilo", "Kilo", "KILO"],
    milli: ["m", "milli", "Milli", "MILLI"],
    micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
    nano: ["N", "n", "nano", "Nano", "NANO"],
    pico: ["P", "p", "pico", "Pico", "PICO"],
  },
  unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
  unitsLong: [
    "OHM", "Ohm", "ohm", "ohms",
    "FARAD", "Farad", "farad",
    "HENRY", "Henry", "henry"
  ],
  getMultiplier: function(s) {
    if (this.prefixes.giga.includes(s)) return 1e9;
    if (this.prefixes.mega.includes(s)) return 1e6;
    if (this.prefixes.kilo.includes(s)) return 1e3;
    if (this.prefixes.milli.includes(s)) return 1e-3;
    if (this.prefixes.micro.includes(s)) return 1e-6;
    if (this.prefixes.nano.includes(s)) return 1e-9;
    if (this.prefixes.pico.includes(s)) return 1e-12;
    return 1;
  },
  valueRegex: null,
}

function initUtils() {
  var allPrefixes = units.prefixes.giga
                    .concat(units.prefixes.mega)
                    .concat(units.prefixes.kilo)
                    .concat(units.prefixes.milli)
                    .concat(units.prefixes.micro)
                    .concat(units.prefixes.nano)
                    .concat(units.prefixes.pico);
  var allUnits = units.unitsShort.concat(units.unitsLong);
  units.valueRegex = new RegExp("^([0-9\.]+)" +
                         "\\s*(" + allPrefixes.join("|") + ")?" +
                         "(" + allUnits.join("|") + ")?" +
                         "(\\b.*)?$", "");
  units.valueAltRegex = new RegExp("^([0-9]*)" +
                         "(" + units.unitsShort.join("|") + ")?" +
                         "([GgMmKkUuNnPp])?" +
                         "([0-9]*)" +
                         "(\\b.*)?$", "");
  for (var bom_type of ["both", "F", "B"]) {
    for (var row of pcbdata.bom[bom_type]) {
      row.push(parseValue(row[1], row[3][0][0]));
    }
  }
}

function parseValue(val, ref) {
  var inferUnit = (unit, ref) => {
    if (unit) {
      unit = unit.toLowerCase();
      if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
        unit = 'r';
      }
      unit = unit[0];
    } else {
      ref = /^([a-z]+)\d+$/i.exec(ref);
      if (ref) {
        ref = ref[1].toLowerCase();
        if (ref == "c") unit = 'f';
        else if (ref == "l") unit = 'h';
        else if (ref == "r" || ref == "rv") unit = 'r';
        else unit = null;
      }
    }
    return unit;
  };
  val = val.replace(/,/g, "");
  var match = units.valueRegex.exec(val);
  var unit;
  if (match) {
    val = parseFloat(match[1]);
    if (match[2]) {
      val = val * units.getMultiplier(match[2]);
    }
    unit = inferUnit(match[3], ref);
    if (!unit) return null;
    else return {
      val: val,
      unit: unit,
      extra: match[4],
    }
  }
  match = units.valueAltRegex.exec(val);
  if (match && (match[1] || match[4])) {
    val = parseFloat(match[1] + "." + match[4]);
    if (match[3]) {
      val = val * units.getMultiplier(match[3]);
    }
    unit = inferUnit(match[2], ref);
    if (!unit) return null;
    else return {
      val: val,
      unit: unit,
      extra: match[5],
    }
  }
  return null;
}

function valueCompare(a, b, stra, strb) {
  if (a === null && b === null) {
    // Failed to parse both values, compare them as strings.
    if (stra != strb) return stra > strb ? 1 : -1;
    else return 0;
  } else if (a === null) {
    return 1;
  } else if (b === null) {
    return -1;
  } else {
    if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
    else if (a.val != b.val) return a.val > b.val ? 1 : -1;
    else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
    else return 0;
  }
}

function validateSaveImgDimension(element) {
  var valid = false;
  var intValue = 0;
  if (/^[1-9]\d*$/.test(element.value)) {
    intValue = parseInt(element.value);
    if (intValue <= 16000) {
      valid = true;
    }
  }
  if (valid) {
    element.classList.remove("invalid");
  } else {
    element.classList.add("invalid");
  }
  return intValue;
}

function saveImage(layer) {
  var width = validateSaveImgDimension(document.getElementById("render-save-width"));
  var height = validateSaveImgDimension(document.getElementById("render-save-height"));
  var bgcolor = null;
  if (!document.getElementById("render-save-transparent").checked) {
    var style = getComputedStyle(topmostdiv);
    bgcolor = style.getPropertyValue("background-color");
  }
  if (!width || !height) return;

  // Prepare image
  var canvas = document.createElement("canvas");
  var layerdict = {
    transform: {
      x: 0,
      y: 0,
      s: 1,
      panx: 0,
      pany: 0,
      zoom: 1,
    },
    bg: canvas,
    fab: canvas,
    silk: canvas,
    highlight: canvas,
    layer: layer,
  }
  // Do the rendering
  recalcLayerScale(layerdict, width, height);
  prepareLayer(layerdict);
  clearCanvas(canvas, bgcolor);
  drawBackground(layerdict, false);
  drawHighlightsOnLayer(layerdict, false);

  // Save image
  var imgdata = canvas.toDataURL("image/png");

  var filename = pcbdata.metadata.title;
  if (pcbdata.metadata.revision) {
    filename += `.${pcbdata.metadata.revision}`;
  }
  filename += `.${layer}.png`;
  saveFile(filename, dataURLtoBlob(imgdata));
}

function saveSettings() {
  var data = {
    type: "InteractiveHtmlBom settings",
    version: 1,
    pcbmetadata: pcbdata.metadata,
    settings: settings,
  }
  var blob = new Blob([JSON.stringify(data, null, 4)], {type: "application/json"});
  saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
}

function loadSettings() {
  var input = document.createElement("input");
  input.type = "file";
  input.accept = ".settings.json";
  input.onchange = function(e) {
    var file = e.target.files[0];
    var reader = new FileReader();
    reader.onload = readerEvent => {
      var content = readerEvent.target.result;
      var newSettings;
      try {
        newSettings = JSON.parse(content);
      } catch(e) {
        alert("Selected file is not InteractiveHtmlBom settings file.");
        return;
      }
      if (newSettings.type != "InteractiveHtmlBom settings") {
        alert("Selected file is not InteractiveHtmlBom settings file.");
        return;
      }
      var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
      if (metadataMatches) {
        for (var k in pcbdata.metadata) {
          if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
            metadataMatches = false;
          }
        }
      }
      if (!metadataMatches) {
        var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
        var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
        if (!confirm(
          `Settins file metadata does not match current metadata.\n\n` +
          `Page metadata:\n${currentMetadata}\n\n` +
          `Settings file metadata:\n${fileMetadata}\n\n` +
          `Press OK if you would like to import settings anyway.`)) {
          return;
        }
      }
      overwriteSettings(newSettings.settings);
    }
    reader.readAsText(file, 'UTF-8');
  }
  input.click();
}

function overwriteSettings(newSettings) {
  initDone = false;
  Object.assign(settings, newSettings);
  writeStorage("bomlayout", settings.bomlayout);
  writeStorage("bommode", settings.bommode);
  writeStorage("canvaslayout", settings.canvaslayout);
  writeStorage("bomCheckboxes", settings.checkboxes.join(","));
  document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
  for (var checkbox of settings.checkboxes) {
    writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
  }
  padsVisible(settings.renderPads);
  document.getElementById("padsCheckbox").checked = settings.renderPads;
  fabricationVisible(settings.renderFabrication);
  document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
  silkscreenVisible(settings.renderSilkscreen);
  document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
  referencesVisible(settings.renderReferences);
  document.getElementById("referencesCheckbox").checked = settings.renderReferences;
  valuesVisible(settings.renderValues);
  document.getElementById("valuesCheckbox").checked = settings.renderValues;
  tracksVisible(settings.renderTracks);
  document.getElementById("tracksCheckbox").checked = settings.renderTracks;
  zonesVisible(settings.renderZones);
  document.getElementById("zonesCheckbox").checked = settings.renderZones;
  dnpOutline(settings.renderDnpOutline);
  document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
  setRedrawOnDrag(settings.redrawOnDrag);
  document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
  setDarkMode(settings.darkMode);
  document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
  setHighlightPin1(settings.highlightpin1);
  document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
  writeStorage("boardRotation", settings.boardRotation);
  document.getElementById("boardRotation").value = settings.boardRotation / 5;
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  initDone = true;
  prepCheckboxes();
  changeBomLayout(settings.bomlayout);
}

function saveFile(filename, blob) {
  var link = document.createElement("a");
  var objurl = URL.createObjectURL(blob);
  link.download = filename;
  link.href = objurl;
  link.click();
}

function dataURLtoBlob(dataurl) {
  var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
      bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
  while(n--){
      u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], {type:mime});
}

var settings = {
  canvaslayout: "default",
  bomlayout: "default",
  bommode: "grouped",
  checkboxes: [],
  checkboxStoredRefs: {},
  darkMode: false,
  highlightpin1: false,
  redrawOnDrag: true,
  boardRotation: 0,
  renderPads: true,
  renderReferences: true,
  renderValues: true,
  renderSilkscreen: true,
  renderFabrication: true,
  renderDnpOutline: false,
  renderTracks: true,
  renderZones: true,
}

function initDefaults() {
  settings.bomlayout = readStorage("bomlayout");
  if (settings.bomlayout === null) {
    settings.bomlayout = config.bom_view;
  }
  if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
    settings.bomlayout = config.bom_view;
  }
  settings.bommode = readStorage("bommode");
  if (settings.bommode === null) {
    settings.bommode = "grouped";
  }
  if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
    settings.bommode = "grouped";
  }
  settings.canvaslayout = readStorage("canvaslayout");
  if (settings.canvaslayout === null) {
    settings.canvaslayout = config.layer_view;
  }
  var bomCheckboxes = readStorage("bomCheckboxes");
  if (bomCheckboxes === null) {
    bomCheckboxes = config.checkboxes;
  }
  settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
  document.getElementById("bomCheckboxes").value = bomCheckboxes;

  function initBooleanSetting(storageString, def, elementId, func) {
    var b = readStorage(storageString);
    if (b === null) {
      b = def;
    } else {
      b = (b == "true");
    }
    document.getElementById(elementId).checked = b;
    func(b);
  }

  initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
  initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
  initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
  initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
  initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
  if ("tracks" in pcbdata) {
    initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
    initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
  } else {
    document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
    tracksVisible(false);
    zonesVisible(false);
  }
  initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
  initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
  initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
  initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
  settings.boardRotation = readStorage("boardRotation");
  if (settings.boardRotation === null) {
    settings.boardRotation = config.board_rotation * 5;
  } else {
    settings.boardRotation = parseInt(settings.boardRotation);
  }
  document.getElementById("boardRotation").value = settings.boardRotation / 5;
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
}

///////////////////////////////////////////////

///////////////////////////////////////////////
/* PCB rendering code */

var emptyContext2d = document.createElement("canvas").getContext("2d");

function deg2rad(deg) {
  return deg * Math.PI / 180;
}

function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
  var point = [
    linepoint[0] * text.width + offsetx,
    linepoint[1] * text.height + offsety
  ];
  // Adding half a line height here is technically a bug
  // but pcbnew currently does the same, text is slightly shifted.
  point[0] -= (point[1] + text.height * 0.5) * tilt;
  return point;
}

function drawtext(ctx, text, color, flip) {
  if ("ref" in text && !settings.renderReferences) return;
  if ("val" in text && !settings.renderValues) return;
  ctx.save();
  ctx.fillStyle = color;
  ctx.strokeStyle = color;
  ctx.lineCap = "round";
  ctx.lineJoin = "round";
  ctx.lineWidth = text.thickness;
  if (text.svgpath) {
    ctx.stroke(new Path2D(text.svgpath));
    ctx.restore();
    return;
  }
  ctx.translate(...text.pos);
  var angle = -text.angle;
  if (text.attr.includes("mirrored")) {
    ctx.scale(-1, 1);
    angle = -angle;
  }
  var tilt = 0;
  if (text.attr.includes("italic")) {
    tilt = 0.125;
  }
  var interline = (text.height * 1.5 + text.thickness) / 2;
  var txt = text.text.split("\n");
  // KiCad ignores last empty line.
  if (txt[txt.length - 1] == '') txt.pop();
  ctx.rotate(deg2rad(angle));
  for (var i in txt) {
    var offsety = (-(txt.length - 1) + i * 2) * interline + text.height / 2;
    var lineWidth = 0;
    for (var c of txt[i]) {
      if (c == '\t') {
        var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
        lineWidth += fourSpaces - lineWidth % fourSpaces;
      } else {
        lineWidth += pcbdata.font_data[c].w * text.width;
      }
    }
    var offsetx = 0;
    switch (text.horiz_justify) {
      case -1:
        // Justify left, do nothing
        break;
      case 0:
        // Justify center
        offsetx -= lineWidth / 2;
        break;
      case 1:
        // Justify right
        offsetx -= lineWidth;
        break;
    }
    for (var c of txt[i]) {
      if (c == '\t') {
        var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
        offsetx += fourSpaces - offsetx % fourSpaces;
        continue;
      }
      for (var line of pcbdata.font_data[c].l) {
        ctx.beginPath();
        ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
        for (var i = 1; i < line.length; i++) {
          ctx.lineTo(...calcFontPoint(line[i], text, offsetx, offsety, tilt));
        }
        ctx.stroke();
      }
      offsetx += pcbdata.font_data[c].w * text.width;
    }
  }
  ctx.restore();
}

function drawedge(ctx, scalefactor, edge, color) {
  ctx.strokeStyle = color;
  ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
  ctx.lineCap = "round";
  if (edge.svgpath) {
    ctx.stroke(new Path2D(edge.svgpath));
  } else {
    ctx.beginPath();
    if (edge.type == "segment") {
      ctx.moveTo(...edge.start);
      ctx.lineTo(...edge.end);
    }
    if (edge.type == "arc") {
      ctx.arc(
        ...edge.start,
        edge.radius,
        deg2rad(edge.startangle),
        deg2rad(edge.endangle));
    }
    if (edge.type == "circle") {
      ctx.arc(
        ...edge.start,
        edge.radius,
        0, 2 * Math.PI);
      ctx.closePath();
    }
    if (edge.type == "curve") {
      ctx.moveTo(...edge.start);
      ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
    }
    ctx.stroke();
  }
}

function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
  // chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
  var path = new Path2D();
  var width = size[0];
  var height = size[1];
  var x = width * -0.5;
  var y = height * -0.5;
  var chamfOffset = Math.min(width, height) * chamfratio;
  path.moveTo(x, 0);
  if (chamfpos & 4) {
    path.lineTo(x, y + height - chamfOffset);
    path.lineTo(x + chamfOffset, y + height);
    path.lineTo(0, y + height);
  } else {
    path.arcTo(x, y + height, x + width, y + height, radius);
  }
  if (chamfpos & 8) {
    path.lineTo(x + width - chamfOffset, y + height);
    path.lineTo(x + width, y + height - chamfOffset);
    path.lineTo(x + width, 0);
  } else {
    path.arcTo(x + width, y + height, x + width, y, radius);
  }
  if (chamfpos & 2) {
    path.lineTo(x + width, y + chamfOffset);
    path.lineTo(x + width - chamfOffset, y);
    path.lineTo(0, y);
  } else {
    path.arcTo(x + width, y, x, y, radius);
  }
  if (chamfpos & 1) {
    path.lineTo(x + chamfOffset, y);
    path.lineTo(x, y + chamfOffset);
    path.lineTo(x, 0);
  } else {
    path.arcTo(x, y, x, y + height, radius);
  }
  path.closePath();
  return path;
}

function getOblongPath(size) {
  return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
}

function getPolygonsPath(shape) {
  if (shape.path2d) {
    return shape.path2d;
  }
  if (shape.svgpath) {
    shape.path2d = new Path2D(shape.svgpath);
  } else {
    var path = new Path2D();
    for (var polygon of shape.polygons) {
      path.moveTo(...polygon[0]);
      for (var i = 1; i < polygon.length; i++) {
        path.lineTo(...polygon[i]);
      }
      path.closePath();
    }
    shape.path2d = path;
  }
  return shape.path2d;
}

function drawPolygonShape(ctx, shape, color) {
  ctx.save();
  ctx.fillStyle = color;
  if (!shape.svgpath) {
    ctx.translate(...shape.pos);
    ctx.rotate(deg2rad(-shape.angle));
  }
  ctx.fill(getPolygonsPath(shape));
  ctx.restore();
}

function drawDrawing(ctx, layer, scalefactor, drawing, color) {
  if (["segment", "arc", "circle", "curve"].includes(drawing.type)) {
    drawedge(ctx, scalefactor, drawing, color);
  } else if (drawing.type == "polygon") {
    drawPolygonShape(ctx, drawing, color);
  } else {
    drawtext(ctx, drawing, color, layer == "B");
  }
}

function getCirclePath(radius) {
  var path = new Path2D();
  path.arc(0, 0, radius, 0, 2 * Math.PI);
  path.closePath();
  return path;
}

function getCachedPadPath(pad) {
  if (!pad.path2d) {
    // if path2d is not set, build one and cache it on pad object
    if (pad.shape == "rect") {
      pad.path2d = new Path2D();
      pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
    } else if (pad.shape == "oval") {
      pad.path2d = getOblongPath(pad.size);
    } else if (pad.shape == "circle") {
      pad.path2d = getCirclePath(pad.size[0] / 2);
    } else if (pad.shape == "roundrect") {
      pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
    } else if (pad.shape == "chamfrect") {
      pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
    } else if (pad.shape == "custom") {
      pad.path2d = getPolygonsPath(pad);
    }
  }
  return pad.path2d;
}

function drawPad(ctx, pad, color, outline, hole) {
  ctx.save();
  ctx.translate(...pad.pos);
  ctx.rotate(deg2rad(pad.angle));
  if (pad.offset) {
    ctx.translate(...pad.offset);
  }
  ctx.fillStyle = color;
  ctx.strokeStyle = color;
  var path = getCachedPadPath(pad);
  if (outline) {
    ctx.stroke(path);
  } else {
    ctx.fill(path);
  }
  if (pad.type == "th" && hole) {
    if (pad.offset) {
      ctx.translate(-pad.offset[0], -pad.offset[1]);
    }
    ctx.fillStyle = "#CCCCCC";
    if (pad.drillshape == "oblong") {
      ctx.fill(getOblongPath(pad.drillsize));
    } else {
      ctx.fill(getCirclePath(pad.drillsize[0] / 2));
    }
  }
  ctx.restore();
}

function drawModule(ctx, layer, scalefactor, module, padcolor, outlinecolor, highlight, outline) {
  if (highlight) {
    // draw bounding box
    if (module.layer == layer) {
      ctx.save();
      ctx.globalAlpha = 0.2;
      ctx.translate(...module.bbox.pos);
      ctx.rotate(deg2rad(-module.bbox.angle));
      ctx.translate(...module.bbox.relpos);
      ctx.fillStyle = padcolor;
      ctx.fillRect(0, 0, ...module.bbox.size);
      ctx.globalAlpha = 1;
      ctx.strokeStyle = padcolor;
      ctx.strokeRect(0, 0, ...module.bbox.size);
      ctx.restore();
    }
  }
  // draw drawings
  for (var drawing of module.drawings) {
    if (drawing.layer == layer) {
      drawDrawing(ctx, layer, scalefactor, drawing.drawing, padcolor);
    }
  }
  // draw pads
  if (settings.renderPads) {
    for (var pad of module.pads) {
      if (pad.layers.includes(layer)) {
        drawPad(ctx, pad, padcolor, outline, true);
        if (pad.pin1 && settings.highlightpin1) {
          drawPad(ctx, pad, outlinecolor, true, false);
        }
      }
    }
  }
}

function drawEdgeCuts(canvas, scalefactor) {
  var ctx = canvas.getContext("2d");
  var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
  for (var edge of pcbdata.edges) {
    drawedge(ctx, scalefactor, edge, edgecolor);
  }
}

function drawModules(canvas, layer, scalefactor, highlight) {
  var ctx = canvas.getContext("2d");
  ctx.lineWidth = 3 / scalefactor;
  var style = getComputedStyle(topmostdiv);
  var padcolor = style.getPropertyValue('--pad-color');
  var outlinecolor = style.getPropertyValue('--pin1-outline-color');
  if (highlight) {
    padcolor = style.getPropertyValue('--pad-color-highlight');
    outlinecolor = style.getPropertyValue('--pin1-outline-color-highlight');
  }
  for (var i = 0; i < pcbdata.modules.length; i++) {
    var mod = pcbdata.modules[i];
    var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
    if (!highlight || highlightedModules.includes(i)) {
      drawModule(ctx, layer, scalefactor, mod, padcolor, outlinecolor, highlight, outline);
    }
  }
}

function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
  var ctx = canvas.getContext("2d");
  for (var d of pcbdata[layername][layer]) {
    if (["segment", "arc", "circle", "curve"].includes(d.type)) {
      drawedge(ctx, scalefactor, d, edgeColor);
    } else if (d.type == "polygon") {
      drawPolygonShape(ctx, d, polygonColor);
    } else {
      drawtext(ctx, d, textColor, layer == "B");
    }
  }
}

function drawTracks(canvas, layer, color, highlight) {
  ctx = canvas.getContext("2d");
  ctx.strokeStyle = color;
  ctx.lineCap = "round";
  for(var track of pcbdata.tracks[layer]) {
    if (highlight && highlightedNet != track.net) continue;
    ctx.lineWidth = track.width;
    ctx.beginPath();
    ctx.moveTo(...track.start);
    ctx.lineTo(...track.end);
    ctx.stroke();
  }
}

function drawZones(canvas, layer, color, highlight) {
  ctx = canvas.getContext("2d");
  ctx.strokeStyle = color;
  ctx.fillStyle = color;
  ctx.lineJoin = "round";
  for(var zone of pcbdata.zones[layer]) {
    if (!zone.path2d) {
      zone.path2d = getPolygonsPath(zone);
    }
    if (highlight && highlightedNet != zone.net) continue;
    ctx.lineWidth = zone.width ? zone.width : 0;
    ctx.fill(zone.path2d);
    ctx.stroke(zone.path2d);
  }
}

function clearCanvas(canvas, color = null) {
  var ctx = canvas.getContext("2d");
  ctx.save();
  ctx.setTransform(1, 0, 0, 1, 0, 0);
  if (color) {
    ctx.fillStyle = color;
    ctx.fillRect(0, 0, canvas.width, canvas.height);
  } else {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
  }
  ctx.restore();
}

function drawNets(canvas, layer, highlight) {
  var style = getComputedStyle(topmostdiv);
  if (settings.renderTracks) {
    var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
    drawTracks(canvas, layer, trackColor, highlight);
  }
  if (settings.renderZones) {
    var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
    drawZones(canvas, layer, zoneColor, highlight);
  }
  if (highlight && settings.renderPads) {
    var padColor = style.getPropertyValue('--pad-color-highlight');
    var ctx = canvas.getContext("2d");
    for (var mod of pcbdata.modules) {
      // draw pads
      for (var pad of mod.pads) {
        if (highlightedNet != pad.net) continue;
        if (pad.layers.includes(layer)) {
          drawPad(ctx, pad, padColor, false, true);
        }
      }
    }
  }
}

function drawHighlightsOnLayer(canvasdict, clear = true) {
  if (clear) {
    clearCanvas(canvasdict.highlight);
  }
  if (highlightedModules.length > 0) {
    drawModules(canvasdict.highlight, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom, true);
  }
  if (highlightedNet !== null) {
    drawNets(canvasdict.highlight, canvasdict.layer, true);
  }
}

function drawHighlights() {
  drawHighlightsOnLayer(allcanvas.front);
  drawHighlightsOnLayer(allcanvas.back);
}

function drawBackground(canvasdict, clear = true) {
  if (clear) {
    clearCanvas(canvasdict.bg);
    clearCanvas(canvasdict.fab);
    clearCanvas(canvasdict.silk);
  }

  drawNets(canvasdict.bg, canvasdict.layer, false);
  drawModules(canvasdict.bg, canvasdict.layer,
    canvasdict.transform.s * canvasdict.transform.zoom, false);

  drawEdgeCuts(canvasdict.bg, canvasdict.transform.s);

  var style = getComputedStyle(topmostdiv);
  var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
  var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
  var textColor = style.getPropertyValue('--silkscreen-text-color');
  if (settings.renderSilkscreen) {
    drawBgLayer(
      "silkscreen", canvasdict.silk, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom,
      edgeColor, polygonColor, textColor);
  }
  edgeColor = style.getPropertyValue('--fabrication-edge-color');
  polygonColor = style.getPropertyValue('--fabrication-polygon-color');
  textColor = style.getPropertyValue('--fabrication-text-color');
  if (settings.renderFabrication) {
    drawBgLayer(
      "fabrication", canvasdict.fab, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom,
      edgeColor, polygonColor, textColor);
  }
}

function prepareCanvas(canvas, flip, transform) {
  var ctx = canvas.getContext("2d");
  ctx.setTransform(1, 0, 0, 1, 0, 0);
  var fontsize = 1.55;
  ctx.scale(transform.zoom, transform.zoom);
  ctx.translate(transform.panx, transform.pany);
  if (flip) {
    ctx.scale(-1, 1);
  }
  ctx.translate(transform.x, transform.y);
  ctx.rotate(deg2rad(settings.boardRotation));
  ctx.scale(transform.s, transform.s);
}

function prepareLayer(canvasdict) {
  var flip = (canvasdict.layer == "B");
  for (var c of ["bg", "fab", "silk", "highlight"]) {
    prepareCanvas(canvasdict[c], flip, canvasdict.transform);
  }
}

function rotateVector(v, angle) {
  angle = deg2rad(angle);
  return [
    v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
    v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
  ];
}

function applyRotation(bbox) {
  var corners = [
    [bbox.minx, bbox.miny],
    [bbox.minx, bbox.maxy],
    [bbox.maxx, bbox.miny],
    [bbox.maxx, bbox.maxy],
  ];
  corners = corners.map((v) => rotateVector(v, settings.boardRotation));
  return {
    minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
    miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
    maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
    maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
  }
}

function recalcLayerScale(layerdict, width, height) {
  var bbox = applyRotation(pcbdata.edges_bbox);
  var scalefactor = 0.98 * Math.min(
    width / (bbox.maxx - bbox.minx),
    height / (bbox.maxy - bbox.miny)
  );
  if (scalefactor < 0.1) {
    scalefactor = 1;
  }
  layerdict.transform.s = scalefactor;
  var flip = (layerdict.layer == "B");
  if (flip) {
    layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
  } else {
    layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
  }
  layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
  for (var c of ["bg", "fab", "silk", "highlight"]) {
    canvas = layerdict[c];
    canvas.width = width;
    canvas.height = height;
    canvas.style.width = (width / devicePixelRatio) + "px";
    canvas.style.height = (height / devicePixelRatio) + "px";
  }
}

function redrawCanvas(layerdict) {
  prepareLayer(layerdict);
  drawBackground(layerdict);
  drawHighlightsOnLayer(layerdict);
}

function resizeCanvas(layerdict) {
  var canvasdivid = {
    "F": "frontcanvas",
    "B": "backcanvas"
  } [layerdict.layer];
  var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
  var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
  recalcLayerScale(layerdict, width, height);
  redrawCanvas(layerdict);
}

function resizeAll() {
  resizeCanvas(allcanvas.front);
  resizeCanvas(allcanvas.back);
}

function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
  var A = x - x1;
  var B = y - y1;
  var C = x2 - x1;
  var D = y2 - y1;

  var dot = A * C + B * D;
  var len_sq = C * C + D * D;
  var dx, dy;
  if (len_sq == 0) {
    // start and end of the segment coincide
    dx = x - x1;
    dy = y - y1;
  } else {
    var param = dot / len_sq;
    var xx, yy;
    if (param < 0) {
      xx = x1;
      yy = y1;
    } else if (param > 1) {
      xx = x2;
      yy = y2;
    } else {
      xx = x1 + param * C;
      yy = y1 + param * D;
    }
    dx = x - xx;
    dy = y - yy;
  }
  return dx * dx + dy * dy <= d * d;
}

function pointWithinPad(x, y, pad) {
  var v = [x - pad.pos[0], y - pad.pos[1]];
  v = rotateVector(v, -pad.angle);
  if (pad.offset) {
    v[0] -= pad.offset[0];
    v[1] -= pad.offset[1];
  }
  return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
}

function netHitScan(layer, x, y) {
  // Check track segments
  if (settings.renderTracks && pcbdata.tracks) {
    for(var track of pcbdata.tracks[layer]) {
      if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
        return track.net;
      }
    }
  }
  // Check pads
  if (settings.renderPads) {
    for (var mod of pcbdata.modules) {
      for(var pad of mod.pads) {
        if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
          return pad.net;
        }
      }
    }
  }
  return null;
}

function pointWithinModuleBbox(x, y, bbox) {
  var v = [x - bbox.pos[0], y - bbox.pos[1]];
  v = rotateVector(v, bbox.angle);
  return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
         bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
}

function bboxHitScan(layer, x, y) {
  var result = [];
  for (var i = 0; i < pcbdata.modules.length; i++) {
    var module = pcbdata.modules[i];
    if (module.layer == layer) {
      if (pointWithinModuleBbox(x, y, module.bbox)) {
        result.push(i);
      }
    }
  }
  return result;
}

function handlePointerDown(e, layerdict) {
  if (e.button != 0) {
    return;
  }
  e.preventDefault();
  e.stopPropagation();

  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  layerdict.pointerStates[e.pointerId] = {
    distanceTravelled: 0,
    lastX: e.offsetX,
    lastY: e.offsetY,
    downTime: Date.now(),
  };
}

function handleMouseClick(e, layerdict) {
  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  var x = e.offsetX;
  var y = e.offsetY;
  var t = layerdict.transform;
  if (layerdict.layer == "B") {
    x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
  } else {
    x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
  }
  y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
  var v = rotateVector([x, y], -settings.boardRotation);
  if ("nets" in pcbdata) {
    var net = netHitScan(layerdict.layer, ...v);
    if (net !== highlightedNet) {
      netClicked(net);
    }
  }
  if (highlightedNet === null) {
    var modules = bboxHitScan(layerdict.layer, ...v);
    if (modules.length > 0) {
      modulesClicked(modules);
    }
  }
}

function handlePointerLeave(e, layerdict) {
  e.preventDefault();
  e.stopPropagation();

  if (!settings.redrawOnDrag) {
    redrawCanvas(layerdict);
  }

  delete layerdict.pointerStates[e.pointerId];
}

function resetTransform(layerdict) {
  layerdict.transform.panx = 0;
  layerdict.transform.pany = 0;
  layerdict.transform.zoom = 1;
  redrawCanvas(layerdict);
}

function handlePointerUp(e, layerdict) {
  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  e.preventDefault();
  e.stopPropagation();

  if (e.button == 2) {
    // Reset pan and zoom on right click.
    resetTransform(layerdict);
    layerdict.anotherPointerTapped = false;
    return;
  }

  // We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
  var ptr = layerdict.pointerStates[e.pointerId];
  ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);

  if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
    if (Object.keys(layerdict.pointerStates).length == 1) {
      if (layerdict.anotherPointerTapped) {
        // This is the second pointer coming off of a two-finger tap
        resetTransform(layerdict);
      } else {
        // This is just a regular tap
        handleMouseClick(e, layerdict);
      }
      layerdict.anotherPointerTapped = false;
    } else {
      // This is the first finger coming off of what could become a two-finger tap
      layerdict.anotherPointerTapped = true;
    }
  } else {
    if (!settings.redrawOnDrag) {
      redrawCanvas(layerdict);
    }
    layerdict.anotherPointerTapped = false;
  }

  delete layerdict.pointerStates[e.pointerId];
}

function handlePointerMove(e, layerdict) {
  if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
    return;
  }
  e.preventDefault();
  e.stopPropagation();

  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  var thisPtr = layerdict.pointerStates[e.pointerId];

  var dx = e.offsetX - thisPtr.lastX;
  var dy = e.offsetY - thisPtr.lastY;

  // If this number is low on pointer up, we count the action as a click
  thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);

  if (Object.keys(layerdict.pointerStates).length == 1) {
    // This is a simple drag
    layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
    layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
  } else if (Object.keys(layerdict.pointerStates).length == 2) {
    var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];

    var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
    var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2)     + Math.pow(e.offsetY - otherPtr.lastY, 2));

    var scaleFactor = newDist/oldDist;

    if (scaleFactor != NaN) {
      layerdict.transform.zoom *= scaleFactor;

      var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
      layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
      layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
    }
  }

  thisPtr.lastX = e.offsetX;
  thisPtr.lastY = e.offsetY;

  if (settings.redrawOnDrag) {
    redrawCanvas(layerdict);
  }
}

function handleMouseWheel(e, layerdict) {
  e.preventDefault();
  e.stopPropagation();
  var t = layerdict.transform;
  var wheeldelta = e.deltaY;
  if (e.deltaMode == 1) {
    // FF only, scroll by lines
    wheeldelta *= 30;
  } else if (e.deltaMode == 2) {
    wheeldelta *= 300;
  }
  var m = Math.pow(1.1, -wheeldelta / 40);
  // Limit amount of zoom per tick.
  if (m > 2) {
    m = 2;
  } else if (m < 0.5) {
    m = 0.5;
  }
  t.zoom *= m;
  var zoomd = (1 - m) / t.zoom;
  t.panx += devicePixelRatio * e.offsetX * zoomd;
  t.pany += devicePixelRatio * e.offsetY * zoomd;
  redrawCanvas(layerdict);
}

function addMouseHandlers(div, layerdict) {
  div.addEventListener("pointerdown", function(e) {
    handlePointerDown(e, layerdict);
  });
  div.addEventListener("pointermove", function(e) {
    handlePointerMove(e, layerdict);
  });
  div.addEventListener("pointerup", function(e) {
    handlePointerUp(e, layerdict);
  });
  var pointerleave = function(e) {
    handlePointerLeave(e, layerdict);
  }
  div.addEventListener("pointercancel", pointerleave);
  div.addEventListener("pointerleave", pointerleave);
  div.addEventListener("pointerout", pointerleave);

  div.onwheel = function(e) {
    handleMouseWheel(e, layerdict);
  }
  for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
    element.addEventListener("contextmenu", function(e) {
      e.preventDefault();
    }, false);
  }
}

function setRedrawOnDrag(value) {
  settings.redrawOnDrag = value;
  writeStorage("redrawOnDrag", value);
}

function setBoardRotation(value) {
  settings.boardRotation = value * 5;
  writeStorage("boardRotation", settings.boardRotation);
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  resizeAll();
}

function initRender() {
  allcanvas = {
    front: {
      transform: {
        x: 0,
        y: 0,
        s: 1,
        panx: 0,
        pany: 0,
        zoom: 1,
      },
      pointerStates: {},
      anotherPointerTapped: false,
      bg: document.getElementById("F_bg"),
      fab: document.getElementById("F_fab"),
      silk: document.getElementById("F_slk"),
      highlight: document.getElementById("F_hl"),
      layer: "F",
    },
    back: {
      transform: {
        x: 0,
        y: 0,
        s: 1,
        panx: 0,
        pany: 0,
        zoom: 1,
      },
      pointerStates: {},
      anotherPointerTapped: false,
      bg: document.getElementById("B_bg"),
      fab: document.getElementById("B_fab"),
      silk: document.getElementById("B_slk"),
      highlight: document.getElementById("B_hl"),
      layer: "B",
    }
  };
  addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
  addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
}

///////////////////////////////////////////////

///////////////////////////////////////////////
/* DOM manipulation and misc code */

var bomsplit;
var canvassplit;
var initDone = false;
var bomSortFunction = null;
var currentSortColumn = null;
var currentSortOrder = null;
var currentHighlightedRowId;
var highlightHandlers = [];
var moduleIndexToHandler = {};
var netsToHandler = {};
var highlightedModules = [];
var highlightedNet = null;
var lastClicked;

function dbg(html) {
  dbgdiv.innerHTML = html;
}

function redrawIfInitDone() {
  if (initDone) {
    redrawCanvas(allcanvas.front);
    redrawCanvas(allcanvas.back);
  }
}

function padsVisible(value) {
  writeStorage("padsVisible", value);
  settings.renderPads = value;
  redrawIfInitDone();
}

function referencesVisible(value) {
  writeStorage("referencesVisible", value);
  settings.renderReferences = value;
  redrawIfInitDone();
}

function valuesVisible(value) {
  writeStorage("valuesVisible", value);
  settings.renderValues = value;
  redrawIfInitDone();
}

function tracksVisible(value) {
  writeStorage("tracksVisible", value);
  settings.renderTracks = value;
  redrawIfInitDone();
}

function zonesVisible(value) {
  writeStorage("zonesVisible", value);
  settings.renderZones = value;
  redrawIfInitDone();
}

function dnpOutline(value) {
  writeStorage("dnpOutline", value);
  settings.renderDnpOutline = value;
  redrawIfInitDone();
}

function setDarkMode(value) {
  if (value) {
    topmostdiv.classList.add("dark");
  } else {
    topmostdiv.classList.remove("dark");
  }
  writeStorage("darkmode", value);
  settings.darkMode = value;
  redrawIfInitDone();
}

function fabricationVisible(value) {
  writeStorage("fabricationVisible", value);
  settings.renderFabrication = value;
  redrawIfInitDone();
}

function silkscreenVisible(value) {
  writeStorage("silkscreenVisible", value);
  settings.renderSilkscreen = value;
  redrawIfInitDone();
}

function setHighlightPin1(value) {
  writeStorage("highlightpin1", value);
  settings.highlightpin1 = value;
  redrawIfInitDone();
}

function getStoredCheckboxRefs(checkbox) {
  function convert(ref) {
    var intref = parseInt(ref);
    if (isNaN(intref)) {
      for (var i = 0; i < pcbdata.modules.length; i++) {
        if (pcbdata.modules[i].ref == ref) {
          return i;
        }
      }
      return -1;
    } else {
      return intref;
    }
  }
  if (!(checkbox in settings.checkboxStoredRefs)) {
    var val = readStorage("checkbox_" + checkbox);
    settings.checkboxStoredRefs[checkbox] = val ? val : "";
  }
  if (!settings.checkboxStoredRefs[checkbox]) {
    return new Set();
  } else {
    return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
  }
}

function getCheckboxState(checkbox, references) {
  var storedRefsSet = getStoredCheckboxRefs(checkbox);
  var currentRefsSet = new Set(references.map(r => r[1]));
  // Get difference of current - stored
  var difference = new Set(currentRefsSet);
  for (ref of storedRefsSet) {
    difference.delete(ref);
  }
  if (difference.size == 0) {
    // All the current refs are stored
    return "checked";
  } else if (difference.size == currentRefsSet.size) {
    // None of the current refs are stored
    return "unchecked";
  } else {
    // Some of the refs are stored
    return "indeterminate";
  }
}

function setBomCheckboxState(checkbox, element, references) {
  var state = getCheckboxState(checkbox, references);
  element.checked = (state == "checked");
  element.indeterminate = (state == "indeterminate");
}

function createCheckboxChangeHandler(checkbox, references) {
  return function() {
    refsSet = getStoredCheckboxRefs(checkbox);
    if (this.checked) {
      // checkbox ticked
      for (var ref of references) {
        refsSet.add(ref[1]);
      }
    } else {
      // checkbox unticked
      for (var ref of references) {
        refsSet.delete(ref[1]);
      }
    }
    settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
    writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
    updateCheckboxStats(checkbox);
  }
}

function clearHighlightedModules() {
  if (currentHighlightedRowId) {
    document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
    currentHighlightedRowId = null;
    highlightedModules = [];
    highlightedNet = null;
  }
}

function createRowHighlightHandler(rowid, refs, net) {
  return function() {
    if (currentHighlightedRowId) {
      if (currentHighlightedRowId == rowid) {
        return;
      }
      document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
    }
    document.getElementById(rowid).classList.add("highlighted");
    currentHighlightedRowId = rowid;
    highlightedModules = refs ? refs.map(r => r[1]) : [];
    highlightedNet = net;
    drawHighlights();
  }
}

function entryMatches(entry) {
  if (settings.bommode == "netlist") {
    // entry is just a net name
    return entry.toLowerCase().indexOf(filter) >= 0;
  }
  // check refs
  for (var ref of entry[3]) {
    if (ref[0].toLowerCase().indexOf(filter) >= 0) {
      return true;
    }
  }
  // check extra fields
  for (var i in config.extra_fields) {
    if (entry[4][i].toLowerCase().indexOf(filter) >= 0) {
      return true;
    }
  }
  // check value
  if (entry[1].toLowerCase().indexOf(filter) >= 0) {
    return true;
  }
  // check footprint
  if (entry[2].toLowerCase().indexOf(filter) >= 0) {
    return true;
  }
  return false;
}

function findRefInEntry(entry) {
  return entry[3].filter(r => r[0].toLowerCase() == reflookup);
}

function highlightFilter(s) {
  if (!filter) {
    return s;
  }
  var parts = s.toLowerCase().split(filter);
  if (parts.length == 1) {
    return s;
  }
  var r = "";
  var pos = 0;
  for (var i in parts) {
    if (i > 0) {
      r += '<mark class="highlight">' +
        s.substring(pos, pos + filter.length) +
        '</mark>';
      pos += filter.length;
    }
    r += s.substring(pos, pos + parts[i].length);
    pos += parts[i].length;
  }
  return r;
}

function checkboxSetUnsetAllHandler(checkboxname) {
  return function() {
    var checkboxnum = 0;
    while (checkboxnum < settings.checkboxes.length &&
      settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
      checkboxnum++;
    }
    if (checkboxnum >= settings.checkboxes.length) {
      return;
    }
    var allset = true;
    var checkbox;
    var row;
    for (row of bombody.childNodes) {
      checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
      if (!checkbox.checked || checkbox.indeterminate) {
        allset = false;
        break;
      }
    }
    for (row of bombody.childNodes) {
      checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
      checkbox.checked = !allset;
      checkbox.indeterminate = false;
      checkbox.onchange();
    }
  }
}

function createColumnHeader(name, cls, comparator) {
  var th = document.createElement("TH");
  th.innerHTML = name;
  th.classList.add(cls);
  th.style.cursor = "pointer";
  var span = document.createElement("SPAN");
  span.classList.add("sortmark");
  span.classList.add("none");
  th.appendChild(span);
  th.onclick = function() {
    if (currentSortColumn && this !== currentSortColumn) {
      // Currently sorted by another column
      currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
      currentSortColumn.childNodes[1].classList.add("none");
      currentSortColumn = null;
      currentSortOrder = null;
    }
    if (currentSortColumn && this === currentSortColumn) {
      // Already sorted by this column
      if (currentSortOrder == "asc") {
        // Sort by this column, descending order
        bomSortFunction = function(a, b) {
          return -comparator(a, b);
        }
        currentSortColumn.childNodes[1].classList.remove("asc");
        currentSortColumn.childNodes[1].classList.add("desc");
        currentSortOrder = "desc";
      } else {
        // Unsort
        bomSortFunction = null;
        currentSortColumn.childNodes[1].classList.remove("desc");
        currentSortColumn.childNodes[1].classList.add("none");
        currentSortColumn = null;
        currentSortOrder = null;
      }
    } else {
      // Sort by this column, ascending order
      bomSortFunction = comparator;
      currentSortColumn = this;
      currentSortColumn.childNodes[1].classList.remove("none");
      currentSortColumn.childNodes[1].classList.add("asc");
      currentSortOrder = "asc";
    }
    populateBomBody();
  }
  return th;
}

function populateBomHeader() {
  while (bomhead.firstChild) {
    bomhead.removeChild(bomhead.firstChild);
  }
  var tr = document.createElement("TR");
  var th = document.createElement("TH");
  th.classList.add("numCol");
  tr.appendChild(th);
  var checkboxCompareClosure = function(checkbox) {
    return (a, b) => {
      var stateA = getCheckboxState(checkbox, a[3]);
      var stateB = getCheckboxState(checkbox, b[3]);
      if (stateA > stateB) return -1;
      if (stateA < stateB) return 1;
      return 0;
    }
  }
  if (settings.bommode == "netlist") {
    th = createColumnHeader("Net name", "bom-netname", (a, b) => {
      if (a > b) return -1;
      if (a < b) return 1;
      return 0;
    });
    tr.appendChild(th);
  } else {
    for (var checkbox of settings.checkboxes) {
      th = createColumnHeader(
        checkbox, "bom-checkbox", checkboxCompareClosure(checkbox));
      th.onclick = fancyDblClickHandler(
        th, th.onclick.bind(th), checkboxSetUnsetAllHandler(checkbox));
      tr.appendChild(th);
    }
    tr.appendChild(createColumnHeader("References", "References", (a, b) => {
      var i = 0;
      while (i < a[3].length && i < b[3].length) {
        if (a[3][i] != b[3][i]) return a[3][i] > b[3][i] ? 1 : -1;
        i++;
      }
      return a[3].length - b[3].length;
    }));
    // Extra fields
    if (config.extra_fields.length > 0) {
      var extraFieldCompareClosure = function(fieldIndex) {
        return (a, b) => {
          var fa = a[4][fieldIndex];
          var fb = b[4][fieldIndex];
          if (fa != fb) return fa > fb ? 1 : -1;
          else return 0;
        }
      }
      for (var i in config.extra_fields) {
        tr.appendChild(createColumnHeader(
          config.extra_fields[i], "extra", extraFieldCompareClosure(i)));
      }
    }
    tr.appendChild(createColumnHeader("Value", "Value", (a, b) => {
      return valueCompare(a[5], b[5], a[1], b[1]);
    }));
    tr.appendChild(createColumnHeader("Footprint", "Footprint", (a, b) => {
      if (a[2] != b[2]) return a[2] > b[2] ? 1 : -1;
      else return 0;
    }));
    if (settings.bommode == "grouped") {
      tr.appendChild(createColumnHeader("Quantity", "Quantity", (a, b) => {
        return a[3].length - b[3].length;
      }));
    }
  }
  bomhead.appendChild(tr);
}

function populateBomBody() {
  while (bom.firstChild) {
    bom.removeChild(bom.firstChild);
  }
  highlightHandlers = [];
  moduleIndexToHandler = {};
  netsToHandler = {};
  currentHighlightedRowId = null;
  var first = true;
  if (settings.bommode == "netlist") {
    bomtable = pcbdata.nets.slice();
  } else {
    switch (settings.canvaslayout) {
      case 'F':
        bomtable = pcbdata.bom.F.slice();
        break;
      case 'FB':
        bomtable = pcbdata.bom.both.slice();
        break;
      case 'B':
        bomtable = pcbdata.bom.B.slice();
        break;
    }
    if (settings.bommode == "ungrouped") {
      // expand bom table
      expandedTable = []
      for (var bomentry of bomtable) {
        for (var ref of bomentry[3]) {
          expandedTable.push([1, bomentry[1], bomentry[2], [ref], bomentry[4], bomentry[5]]);
        }
      }
      bomtable = expandedTable;
    }
  }
  if (bomSortFunction) {
    bomtable = bomtable.sort(bomSortFunction);
  }
  for (var i in bomtable) {
    var bomentry = bomtable[i];
    if (filter && !entryMatches(bomentry)) {
      continue;
    }
    var references = null;
    var netname = null;
    var tr = document.createElement("TR");
    var td = document.createElement("TD");
    var rownum = +i + 1;
    tr.id = "bomrow" + rownum;
    td.textContent = rownum;
    tr.appendChild(td);
    if (settings.bommode == "netlist") {
      netname = bomentry;
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(netname ? netname : "&lt;no net&gt;");
      tr.appendChild(td);
    } else {
      if (reflookup) {
        references = findRefInEntry(bomentry);
        if (references.length == 0) {
          continue;
        }
      } else {
        references = bomentry[3];
      }
      // Checkboxes
      for (var checkbox of settings.checkboxes) {
        if (checkbox) {
          td = document.createElement("TD");
          var input = document.createElement("input");
          input.type = "checkbox";
          input.onchange = createCheckboxChangeHandler(checkbox, references);
          setBomCheckboxState(checkbox, input, references);
          td.appendChild(input);
          tr.appendChild(td);
        }
      }
      // References
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
      tr.appendChild(td);
      // Extra fields
      for (var i in config.extra_fields) {
        td = document.createElement("TD");
        td.innerHTML = highlightFilter(bomentry[4][i]);
        tr.appendChild(td);
      }
      // Value
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(bomentry[1]);
      tr.appendChild(td);
      // Footprint
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(bomentry[2]);
      tr.appendChild(td);
      if (settings.bommode == "grouped") {
        // Quantity
        td = document.createElement("TD");
        td.textContent = bomentry[3].length;
        tr.appendChild(td);
      }
    }
    bom.appendChild(tr);
    var handler = createRowHighlightHandler(tr.id, references, netname);
    tr.onmousemove = handler;
    highlightHandlers.push({
      id: tr.id,
      handler: handler,
    });
    if (references !== null) {
      for (var refIndex of references.map(r => r[1])) {
        moduleIndexToHandler[refIndex] = handler;
      }
    }
    if (netname !== null) {
      netsToHandler[netname] = handler;
    }
    if ((filter || reflookup) && first) {
      handler();
      first = false;
    }
  }
}

function highlightPreviousRow() {
  if (!currentHighlightedRowId) {
    highlightHandlers[highlightHandlers.length - 1].handler();
  } else {
    if (highlightHandlers.length > 1 &&
      highlightHandlers[0].id == currentHighlightedRowId) {
      highlightHandlers[highlightHandlers.length - 1].handler();
    } else {
      for (var i = 0; i < highlightHandlers.length - 1; i++) {
        if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
          highlightHandlers[i].handler();
          break;
        }
      }
    }
  }
  smoothScrollToRow(currentHighlightedRowId);
}

function highlightNextRow() {
  if (!currentHighlightedRowId) {
    highlightHandlers[0].handler();
  } else {
    if (highlightHandlers.length > 1 &&
      highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
      highlightHandlers[0].handler();
    } else {
      for (var i = 1; i < highlightHandlers.length; i++) {
        if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
          highlightHandlers[i].handler();
          break;
        }
      }
    }
  }
  smoothScrollToRow(currentHighlightedRowId);
}

function populateBomTable() {
  populateBomHeader();
  populateBomBody();
}

function modulesClicked(moduleIndexes) {
  var lastClickedIndex = moduleIndexes.indexOf(lastClicked);
  for (var i = 1; i <= moduleIndexes.length; i++) {
    var refIndex = moduleIndexes[(lastClickedIndex + i) % moduleIndexes.length];
    if (refIndex in moduleIndexToHandler) {
      lastClicked = refIndex;
      moduleIndexToHandler[refIndex]();
      smoothScrollToRow(currentHighlightedRowId);
      break;
    }
  }
}

function netClicked(net) {
  if (net in netsToHandler) {
    netsToHandler[net]();
    smoothScrollToRow(currentHighlightedRowId);
  } else {
    clearHighlightedModules();
    highlightedNet = net;
    drawHighlights();
  }
}

function updateFilter(input) {
  filter = input.toLowerCase();
  populateBomTable();
}

function updateRefLookup(input) {
  reflookup = input.toLowerCase();
  populateBomTable();
}

function changeCanvasLayout(layout) {
  document.getElementById("fl-btn").classList.remove("depressed");
  document.getElementById("fb-btn").classList.remove("depressed");
  document.getElementById("bl-btn").classList.remove("depressed");
  switch (layout) {
    case 'F':
      document.getElementById("fl-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.collapse(1);
      }
      break;
    case 'B':
      document.getElementById("bl-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.collapse(0);
      }
      break;
    default:
      document.getElementById("fb-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.setSizes([50, 50]);
      }
  }
  settings.canvaslayout = layout;
  writeStorage("canvaslayout", layout);
  resizeAll();
  changeBomMode(settings.bommode);
}

function populateMetadata() {
  document.getElementById("title").innerHTML = pcbdata.metadata.title;
  document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
  document.getElementById("company").innerHTML = pcbdata.metadata.company;
  document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
  if (pcbdata.metadata.title != "") {
    document.title = pcbdata.metadata.title + " BOM";
  }
  var fp_f = 0, fp_b = 0, pads_f = 0, pads_b = 0, pads_th = 0;
  for (var i = 0; i < pcbdata.modules.length; i++) {
    if (pcbdata.bom.skipped.includes(i)) continue;
    var mod = pcbdata.modules[i];
    if (mod.layer == "F") {
      fp_f++;
    } else {
      fp_b++;
    }
    for (var pad of mod.pads) {
      if (pad.type == "th") {
        pads_th++;
      } else {
        if (pad.layers.includes("F")) {
          pads_f++;
        }
        if (pad.layers.includes("B")) {
          pads_b++;
        }
      }
    }
  }
  document.getElementById("stats-components-front").innerHTML = fp_f;
  document.getElementById("stats-components-back").innerHTML = fp_b;
  document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
  document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
  document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
  document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
  document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
  document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
  document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
  document.getElementById("stats-th-pads").innerHTML = pads_th;
}

function changeBomLayout(layout) {
  document.getElementById("bom-btn").classList.remove("depressed");
  document.getElementById("lr-btn").classList.remove("depressed");
  document.getElementById("tb-btn").classList.remove("depressed");
  switch (layout) {
    case 'bom-only':
      document.getElementById("bom-btn").classList.add("depressed");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      document.getElementById("frontcanvas").style.display = "none";
      document.getElementById("backcanvas").style.display = "none";
      document.getElementById("bot").style.height = "";
      break;
    case 'top-bottom':
      document.getElementById("tb-btn").classList.add("depressed");
      document.getElementById("frontcanvas").style.display = "";
      document.getElementById("backcanvas").style.display = "";
      document.getElementById("bot").style.height = "calc(100% - 80px)";
      document.getElementById("bomdiv").classList.remove("split-horizontal");
      document.getElementById("canvasdiv").classList.remove("split-horizontal");
      document.getElementById("frontcanvas").classList.add("split-horizontal");
      document.getElementById("backcanvas").classList.add("split-horizontal");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      bomsplit = Split(['#bomdiv', '#canvasdiv'], {
        sizes: [50, 50],
        onDragEnd: resizeAll,
        direction: "vertical",
        gutterSize: 5
      });
      canvassplit = Split(['#frontcanvas', '#backcanvas'], {
        sizes: [50, 50],
        gutterSize: 5,
        onDragEnd: resizeAll
      });
      break;
    case 'left-right':
      document.getElementById("lr-btn").classList.add("depressed");
      document.getElementById("frontcanvas").style.display = "";
      document.getElementById("backcanvas").style.display = "";
      document.getElementById("bot").style.height = "calc(100% - 80px)";
      document.getElementById("bomdiv").classList.add("split-horizontal");
      document.getElementById("canvasdiv").classList.add("split-horizontal");
      document.getElementById("frontcanvas").classList.remove("split-horizontal");
      document.getElementById("backcanvas").classList.remove("split-horizontal");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      bomsplit = Split(['#bomdiv', '#canvasdiv'], {
        sizes: [50, 50],
        onDragEnd: resizeAll,
        gutterSize: 5
      });
      canvassplit = Split(['#frontcanvas', '#backcanvas'], {
        sizes: [50, 50],
        gutterSize: 5,
        direction: "vertical",
        onDragEnd: resizeAll
      });
  }
  settings.bomlayout = layout;
  writeStorage("bomlayout", layout);
  changeCanvasLayout(settings.canvaslayout);
}

function changeBomMode(mode) {
  document.getElementById("bom-grouped-btn").classList.remove("depressed");
  document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
  document.getElementById("bom-netlist-btn").classList.remove("depressed");
  switch (mode) {
    case 'grouped':
      document.getElementById("bom-grouped-btn").classList.add("depressed");
      break;
    case 'ungrouped':
      document.getElementById("bom-ungrouped-btn").classList.add("depressed");
      break;
    case 'netlist':
      document.getElementById("bom-netlist-btn").classList.add("depressed");
  }
  writeStorage("bommode", mode);
  if (mode != settings.bommode) {
    settings.bommode = mode;
    bomSortFunction = null;
    currentSortColumn = null;
    currentSortOrder = null;
    clearHighlightedModules();
  }
  populateBomTable();
}

function focusFilterField() {
  focusInputField(document.getElementById("filter"));
}

function focusRefLookupField() {
  focusInputField(document.getElementById("reflookup"));
}

function toggleBomCheckbox(bomrowid, checkboxnum) {
  if (!bomrowid || checkboxnum > settings.checkboxes.length) {
    return;
  }
  var bomrow = document.getElementById(bomrowid);
  var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
  checkbox.checked = !checkbox.checked;
  checkbox.indeterminate = false;
  checkbox.onchange();
}

function checkBomCheckbox(bomrowid, checkboxname) {
  var checkboxnum = 0;
  while (checkboxnum < settings.checkboxes.length &&
    settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
    checkboxnum++;
  }
  if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
    return;
  }
  var bomrow = document.getElementById(bomrowid);
  var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
  checkbox.checked = true;
  checkbox.indeterminate = false;
  checkbox.onchange();
}

function setBomCheckboxes(value) {
  writeStorage("bomCheckboxes", value);
  settings.checkboxes = value.split(",").filter((e) => e);
  prepCheckboxes();
  populateBomTable();
}

function prepCheckboxes() {
  var table = document.getElementById("checkbox-stats");
  while (table.childElementCount > 1) {
    table.removeChild(table.lastChild);
  }
  if (settings.checkboxes.length) {
    table.style.display = "";
  } else {
    table.style.display = "none";
  }
  for (var checkbox of settings.checkboxes) {
    var tr = document.createElement("TR");
    var td = document.createElement("TD");
    td.innerHTML = checkbox;
    tr.appendChild(td);
    td = document.createElement("TD");
    td.id = "checkbox-stats-" + checkbox;
    var progressbar = document.createElement("div");
    progressbar.classList.add("bar");
    td.appendChild(progressbar);
    var text = document.createElement("div");
    text.classList.add("text");
    td.appendChild(text);
    tr.appendChild(td);
    table.appendChild(tr);
    updateCheckboxStats(checkbox);
  }
}

function updateCheckboxStats(checkbox) {
  var checked = getStoredCheckboxRefs(checkbox).size;
  var total = pcbdata.modules.length - pcbdata.bom.skipped.length;
  var percent = checked * 100.0 / total;
  var td = document.getElementById("checkbox-stats-" + checkbox);
  td.firstChild.style.width = percent + "%";
  td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}

document.onkeydown = function(e) {
  switch (e.key) {
    case "n":
      if (document.activeElement.type == "text") {
        return;
      }
      if (currentHighlightedRowId !== null) {
        checkBomCheckbox(currentHighlightedRowId, "placed");
        highlightNextRow();
        e.preventDefault();
      }
      break;
    case "ArrowUp":
      highlightPreviousRow();
      e.preventDefault();
      break;
    case "ArrowDown":
      highlightNextRow();
      e.preventDefault();
      break;
    default:
      break;
  }
  if (e.altKey) {
    switch (e.key) {
      case "f":
        focusFilterField();
        e.preventDefault();
        break;
      case "r":
        focusRefLookupField();
        e.preventDefault();
        break;
      case "z":
        changeBomLayout("bom-only");
        e.preventDefault();
        break;
      case "x":
        changeBomLayout("left-right");
        e.preventDefault();
        break;
      case "c":
        changeBomLayout("top-bottom");
        e.preventDefault();
        break;
      case "v":
        changeCanvasLayout("F");
        e.preventDefault();
        break;
      case "b":
        changeCanvasLayout("FB");
        e.preventDefault();
        break;
      case "n":
        changeCanvasLayout("B");
        e.preventDefault();
        break;
      default:
        break;
    }
    if (e.key >= '1' && e.key <= '9') {
      toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
    }
  }
}

function hideNetlistButton() {
  document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
  document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
  document.getElementById("bom-netlist-btn").style.display = "none";
}

window.onload = function(e) {
  initUtils();
  initRender();
  initStorage();
  initDefaults();
  cleanGutters();
  populateMetadata();
  dbgdiv = document.getElementById("dbg");
  bom = document.getElementById("bombody");
  bomhead = document.getElementById("bomhead");
  filter = "";
  reflookup = "";
  if (!("nets" in pcbdata)) {
    hideNetlistButton();
  }
  initDone = true;
  prepCheckboxes();
  // Triggers render
  changeBomLayout(settings.bomlayout);
}

window.onresize = resizeAll;
window.matchMedia("print").addListener(resizeAll);

///////////////////////////////////////////////

  </script>
</head>

<body>
<div id="topmostdiv" class="topmostdiv">
  <div id="top">
    <div style="float: right; height: 100%;">
      <div class="hideonprint menu" style="float: right; top: 8px;">
        <button class="menubtn"></button>
        <div class="menu-content">
          <label class="menu-label menu-label-top">
            <input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
            Dark mode
          </label>
          <label class="menu-label">
            <input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
            Show footprint pads
          </label>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
            Fab layer
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
            Silkscreen
          </label>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
            References
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
            Values
          </label>
          <div id="tracksAndZonesCheckboxes">
            <label class="menu-label" style="width: calc(50% - 18px)">
              <input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
              Tracks
            </label><!-- This comment eats space! All of it!
            --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
              <input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
              Zones
            </label>
          </div>
          <label class="menu-label">
            <input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
            DNP components outlined
          </label>
          <label class="menu-label">
            <input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
            Highlight first pin
          </label>
          <label class="menu-label">
            <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
            Continuous redraw on drag
          </label>
          <label class="menu-label">
            <span>Board rotation</span>
            <span style="float: right"><span id="rotationDegree">0</span>&#176;</span>
            <input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
          </label>
          <label class="menu-label">
            <div style="margin-left: 5px">Bom checkboxes</div>
            <input id="bomCheckboxes" class="menu-textbox" type=text
                   oninput="setBomCheckboxes(this.value)">
          </label>
          <label class="menu-label">
            <span class="shameless-plug">
              <span>Created using</span>
              <a target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
            </span>
          </label>
        </div>
      </div>
      <div class="button-container hideonprint"
           style="float: right; position: relative; top: 8px">
        <button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
                title="Front only">F
        </button>
        <button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
                title="Front and Back">FB
        </button>
        <button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
                title="Back only">B
        </button>
      </div>
      <div class="button-container hideonprint"
           style="float: right; position: relative; top: 8px">
        <button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
                title="BOM only"></button>
        <button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
                title="BOM left, drawings right"></button>
        <button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
                title="BOM top, drawings bot"></button>
      </div>
      <div class="button-container hideonprint"
           style="float: right; position: relative; top: 8px">
        <button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
                title="Grouped BOM"></button>
        <button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
                title="Ungrouped BOM"></button>
        <button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
                title="Netlist"></button>
      </div>
      <div class="hideonprint menu" style="float: right; top: 8px;">
        <button class="statsbtn"></button>
        <div class="menu-content">
          <table class="stats">
            <tbody>
              <tr>
                <td width="40%">Board stats</td>
                <td>Front</td>
                <td>Back</td>
                <td>Total</td>
              </tr>
              <tr>
                <td>Components</td>
                <td id="stats-components-front">~</td>
                <td id="stats-components-back">~</td>
                <td id="stats-components-total">~</td>
              </tr>
              <tr>
                <td>Groups</td>
                <td id="stats-groups-front">~</td>
                <td id="stats-groups-back">~</td>
                <td id="stats-groups-total">~</td>
              </tr>
              <tr>
                <td>SMD pads</td>
                <td id="stats-smd-pads-front">~</td>
                <td id="stats-smd-pads-back">~</td>
                <td id="stats-smd-pads-total">~</td>
              </tr>
              <tr>
                <td>TH pads</td>
                <td colspan=3 id="stats-th-pads">~</td>
              </tr>
            </tbody>
          </table>
          <table class="stats">
            <col width="40%"/><col />
            <tbody id="checkbox-stats">
              <tr>
                <td colspan=2 style="border-top: 0">Checkboxes</td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
      <div class="hideonprint menu" style="float: right; top: 8px;">
        <button class="iobtn"></button>
        <div class="menu-content">
          <div class="menu-label menu-label-top">
            <div style="margin-left: 5px;">Save board image</div>
            <div class="flexbox">
              <input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
                  style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
              <span>X</span>
              <input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
                  style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
            </div>
            <label>
              <input id="render-save-transparent" type="checkbox">
              Transparent background
            </label>
            <div class="flexbox">
              <button class="savebtn" onclick="saveImage('F')">Front</button>
              <button class="savebtn" onclick="saveImage('B')">Back</button>
            </div>
          </div>
          <div class="menu-label">
            <span style="margin-left: 5px;">Config and checkbox state</span>
            <div class="flexbox">
              <button class="savebtn" onclick="saveSettings()">Export</button>
              <button class="savebtn" onclick="loadSettings()">Import</button>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div id="fileinfodiv" style="overflow: auto;">
      <table class="fileinfo">
        <tbody>
          <tr>
            <td id="title" class="title" style="width: 70%">
              Title
            </td>
            <td id="revision" class="title" style="width: 30%">
              Revision
            </td>
          </tr>
          <tr>
            <td id="company">
              Company
            </td>
            <td id="filedate">
              Date
            </td>
          </tr>
        </tbody>
      </table>
    </div>
  </div>
  <div id="bot" class="split" style="height: calc(100% - 80px)">
    <div id="bomdiv" class="split split-horizontal">
      <div style="width: 100%">
        <input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
               oninput="updateRefLookup(this.value)">
        <input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
               oninput="updateFilter(this.value)">
        <div class="button-container hideonprint" style="float: left; margin: 0;">
          <button id="copy" title="Copy bom table to clipboard"
               onclick="copyToClipboard()"></button>
        </div>
      </div>
      <div id="dbg"></div>
      <table class="bom">
        <thead id="bomhead">
        </thead>
        <tbody id="bombody">
        </tbody>
      </table>
    </div>
    <div id="canvasdiv" class="split split-horizontal">
      <div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
        <div style="position: relative; width: 100%; height: 100%;">
          <canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
          <canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
          <canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
          <canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
        </div>
      </div>
      <div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
        <div style="position: relative; width: 100%; height: 100%;">
          <canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
          <canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
          <canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
          <canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
        </div>
      </div>
    </div>
  </div>
</div>
</body>

</html>
